using System.Reflection;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ApplicationModels;

namespace Vin.Tool.AspNetCore.Conventions;

[Obsolete("Use ApiControllerRouteConvention instead.")]
public class ApiActionRouteConvention : IActionModelConvention
{
    /// <summary>
    /// 目标API程序集。
    /// </summary>
    private readonly Assembly _apiAssembly;

    /// <summary>
    /// API前缀。
    /// </summary>
    private readonly string _apiPrefix;

    public ApiActionRouteConvention(Assembly apiAssembly, string apiPrefix = "")
    {
        _apiAssembly = apiAssembly ?? throw new ArgumentNullException(nameof(apiAssembly));
        _apiPrefix = apiPrefix;
    }

    public void Apply(ActionModel action)
    {
        // 如果没有设置API前缀，则不进行处理
        if (string.IsNullOrEmpty(_apiPrefix)) return;
        // 如果当前Action不属于目标API程序集，则不进行处理
        if (action.Controller.ControllerType.Assembly != _apiAssembly) return;
        
        // 如果控制器处理了，则不处理当前Action
        if(HandleController(action.Controller)) return;
    }

    private bool HandleController(ControllerModel controlerModel)
    {
        return true;
    }

    private void HandleAction(ActionModel action)
    {
        // 设置路由模板
        foreach (var selector in action.Selectors)
        {
            if (selector.AttributeRouteModel == null)
                selector.AttributeRouteModel = new AttributeRouteModel();
            // 原始的路由模板
            var originalTemplate = selector.AttributeRouteModel.Template;
            // 如果原始模板为空，则初始化为API前缀
            if (!string.IsNullOrEmpty(originalTemplate))
            {
                // 添加前缀（例如：将 "Home/Index" 改为 "api2/Home/Index"）
                selector.AttributeRouteModel.Template = $"{_apiPrefix}/{originalTemplate}";
            }
            else
            {
                // 如果没有定义路由模板，直接使用前缀+控制器+动作
                selector.AttributeRouteModel = new AttributeRouteModel
                {
                    Template = $"{_apiPrefix}/[controller]/[action]"
                };
            }
        }
    }
}